package utils

import (
	"encoding/json"
	"io/fs"
	"io/ioutil"
	"os"
	"path"
	"strings"
)

// 获取指定目录下的所有文件,包含子目录下的文件
func GetAllFiles(dirPth string) (files []string, err error) {
	var dirs []string
	dir, err := ioutil.ReadDir(dirPth)
	if err != nil {
		return nil, err
	}

	PthSep := string(os.PathSeparator)
	//suffix = strings.ToUpper(suffix) //忽略后缀匹配的大小写

	for _, fi := range dir {
		if fi.IsDir() { // 目录, 递归遍历
			dirs = append(dirs, dirPth+PthSep+fi.Name())
		} else {
			files = append(files, dirPth+PthSep+fi.Name())
		}
	}

	// 读取子目录下文件
	for _, table := range dirs {
		temp, _ := GetAllFiles(table)
		for _, temp1 := range temp {
			files = append(files, temp1)
		}
	}

	return files, nil
}

/** 创建一个文件 */
func createFile(name string) (*os.File, error) {
	err := os.MkdirAll(string([]rune(name)[0:strings.LastIndex(name, "/")]), 0755)
	if err != nil {
		return nil, err
	}
	return os.Create(name)
}

/** 文件是否存在 */
func FileExists(filename string) bool {
	_, err := os.Stat(filename)
	return !os.IsNotExist(err)
}

/** 向文件中写字节 */
func FileWriteBytes(filename string, data []byte) error {
	file, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, fs.ModePerm)
	if err != nil {
		return err
	}

	_, err = file.Write(data)
	if err != nil {
		file.Close()
		return err
	}

	err = file.Close()
	if err != nil {
		return err
	}
	return nil
}

/** 向文件中写字符串 */
func FileWriteString(filename string, content string) error {
	return FileWriteBytes(filename, []byte(content))
}

/** 向文件中写一个JSON */
func FileWriteObject(filename string, v any) error {
	bytes, err := json.Marshal(v)
	if err != nil {
		return err
	}

	err = FileWriteBytes(filename, bytes)
	if err != nil {
		return err
	}
	return nil
}

/** 从文件读取一个JSON, v是指针 */
func FileReadObject(filename string, v any) error {
	content, err := os.ReadFile(filename)
	if err != nil {
		return err
	}

	err = json.Unmarshal(content, v)
	if err != nil {
		return err
	}
	return nil
}

/** 清空目录 */
func FileClear(dirname string) error {
	dir, _ := ioutil.ReadDir(dirname)
	for _, d := range dir {
		err := os.RemoveAll(path.Join([]string{dirname, d.Name()}...))
		if err != nil {
			return err
		}
	}
	return nil
}

/** 判断一个位置是否挂载了 */
func IsMounted(dir string) bool {
	return Command("mountpoint", dir) == nil
}
